import {Injectable} from '@angular/core';


@Injectable({
  providedIn: 'root'
})
export class CommonTool {
  constructor() {
  }

  /**
   * 非空返回true
   * @param str 效验支付串
   */
  public notNull(str): boolean {
    if (str === undefined) {
      return false;
    } else if (str === null) {
      return false;
    } else if (str === '') {
      return false;
    } else if (typeof str === 'object') {
      if (Object.keys(str).length === 0) {
        return false;
      }
    }
    return true;
  }

  /**
   * 写入指定字段的数据
   * 参数： data 数据对象
   * 参数： field 操作的字段
   * 参数： value 要替换的值
   */
  public setObjectField(data, field, value) {
    if (value === undefined || value === null) {
      console.error('传入的value不能为空,检测配置是否正确!');
      return {};
    }
    if (field === undefined || field === null) {
      console.error('传入的field不能为空,检测配置是否正确!');
      return {};
    }
    let str = '';
    let str1 = '';
    const fields = field.split('.');
    for (let i = 0; i < fields.length; i++) {
      const char = fields[i].split('');
      if (char[0] === '[' && char[char.length - 1] === ']') {
        const length = parseFloat(fields[i].split('[')[1].split(']')[0]);
        str = str + '[';
        for (let j = 0; j < length; j++) {
          if (j !== length) {
            str = str + '{},';
          }
        }
        if (i === fields.length - 1) {
          str = str + JSON.stringify(value) + ']';
        } else {
          str1 = str1 + ']';
        }
      } else {
        if (i === fields.length - 1) {
          str = str + '{"' + fields[i] + '":' + JSON.stringify(value);
          str1 = str1 + '}';
        } else {
          str = str + '{"' + fields[i] + '":';
          str1 = str1 + '}';
        }
      }
    }
    const obj = JSON.parse(str + str1.split('').reverse().join(''));
    return this.deepMerge(data, obj);
  }

  /**
   * 合并对象对像
   * 参数： data
   * 参数： obj
   */
  public deepMerge(data, obj) {
    let key;
    for (key in obj) {
      if (!this.notNull(obj[key])) {
        continue;
      }
      if (data[key] instanceof Array && obj[key] instanceof Array) {
        for (let i = 0; i < obj[key].length; i++) {
          if (this.notNull(data[key][i]) && data[key][i].toString() === '[object Object]') {
            data[key][i] = this.deepMerge(data[key][i], obj[key][i]);
          } else {
            if (JSON.stringify(obj[key][i]) !== '{}') {
              data[key][i] = obj[key][i];
            }
          }
        }
      } else if (data[key] instanceof Array) {
        data[key] = obj[key];
      } else if (this.notNull(data[key]) && data[key].toString() === '[object Object]') {
        this.deepMerge(data[key], obj[key]);
      } else {
        data[key] = obj[key];
      }
    }
    return data;
  }

  /**
   * 获取对象数据
   * 参数 data 数据对象
   * 参数 field 要获取的字段
   */
  public getObjectField(data, field) {
    let obj: any;
    const fields = field.split('.');
    for (let i = 0; i < fields.length; i++) {
      if (i === 0) {
        obj = data[fields[i]];
      } else {
        const char = fields[i].split('');
        if (char[0] === '[' && char[char.length - 1] === ']') {
          const length = fields[i].split('[')[1].split(']')[0];
          if (this.notNull(length)) {
            obj = obj[parseFloat(length)];
          } else {
            console.error('格式错误!');
          }
        } else {
          if (this.notNull(obj)) {
            obj = obj[fields[i]];
          }
        }
      }
    }
    return obj;
  }

  /**
   * 写入Cookie
   * @参数 key 存入数据的key
   * @参数 value 存入数据的值
   * @参数 expires 有效期，单位毫秒,默认:1800000
   * @参数 path Cookie的路径,默认:/
   * @参数 sameSite SameSite 有两个属性值，分别是 Strict 和 Lax,Strict:表明这个 cookie 在任何情况下都不可能作为第三方 cookie
   */
  public setCookie(key, value, expires?, path?, sameSite?) {
    let cookie = key + '=' + value + ';';
    if (this.notNull(expires)) {
      const date = new Date();
      date.setTime(date.getTime() + expires);
      cookie = cookie + 'expires=' + date.toUTCString() + ';';
    }
    if (this.notNull(path)) {
      cookie = cookie + 'path=' + path + ';';
    }
    if (this.notNull(sameSite)) {
      cookie = cookie + 'sameSite=' + sameSite + ';';
    }
    document.cookie = cookie;
  }

  /**
   * 获取Cookie
   * @参数 key 存入数据的key
   */
  public getCookie(key) {
    const name = key + '=';
    const decodedCookie = decodeURIComponent(document.cookie);
    const ca = decodedCookie.split(';');
    for (let i = 0; i < ca.length; i++) {
      let c = ca[i];
      while (c.charAt(0) === ' ') {
        c = c.substring(1);
      }
      if (c.indexOf(name) === 0) {
        return c.substring(name.length, c.length);
      }
    }
    return '';
  }

  /**
   * 删除Cookie
   * @参数 存入数据的key
   */
  public deleteCookie(key, path?) {
    const data = this.getCookie(key);
    this.setCookie(key, data, 1, path);
  }

  /**
   * base64字符串转换为Blob对像
   */
  public dataURItoBlob(base64Data) {
    let byteString;
    byteString = atob(base64Data);
    const ia = new Uint8Array(byteString.length);
    for (let i = 0; i < byteString.length; i++) {
      ia[i] = byteString.charCodeAt(i);
    }
    return new Blob([ia]);
  }

  // 对象转get请求参数
  public getParam(url, data) {
    let obj = '';
    let i = 0;
    let array = [];
    if (this.notNull(data)) {
      array = Object.getOwnPropertyNames(data);
    }
    for (const key of array) {
      i++;
      if (i === array.length) {
        if (this.notNull(data[key])) {
          obj += key + '=' + data[key];
        }
      } else {
        if (this.notNull(data[key])) {
          obj += key + '=' + data[key] + '&';
        }
      }
    }
    return url + '?' + obj;
  }

  // /**
  //  * Base64编码
  //  */
  // public Base64Encode(data) {
  //   return Base64.encode(data);
  // }
  //
  // /**
  //  * Base64解码
  //  */
  // public Base64Decode(data) {
  //   return Base64.decode(data);
  // }


}
